昨天我們一邊認識 generator 的概念,一邊回顧處理山陀兒颱風的程式。今天我們正式的要把 jq 主程式改寫到 .jq 的檔案中囉~
師傅:徒弟,你之前一直在命令提示字元裡用 jq
操作,今天我們來試試寫個完整的 main.jq
程式吧。
徒弟:好啊,怎麼開始呢?
師傅:首先,把你平常在命令列裡使用的 jq
表達式放進一個檔案,命名為 main.jq
。這樣你就可以重複執行,不用每次都重新輸入指令。
徒弟:原本是 jq '.[] | {userId, title}'
我直接把 .[] | {userId, title}
放進 main.jq
裡就行了嗎?
師傅:沒錯!然後你可以這樣執行:jq -f main.jq data.json
,這樣會讀取 main.jq
裡的程式碼來處理 data.json
,相當於從命令列執行轉到程式文件執行。」
徒弟:「這樣寫真的方便多了,謝謝師傅!」
建議使用 VSCode 這個開發工具,並且安裝 jq Syntax Highlighting 這個擴充套件。
安裝之後,打開 .jq 的檔案,就會有語法高亮提示,會好寫很多。
底下是現況的 krathon2024_json.bat 程式:
jq -c -r -s " ...(略)..." direction.json typhoon1005.json beaufort_wind.json
我們要把雙引號內部,也就是 jq 主要處理資料的程式,移動到 main.jq 檔案中。接著,krathon2024_json.bat 程式對應的改成:
jq -c -r -s -f main.jq direction.json typhoon1005.json beaufort_wind.json
注意❗: 使用 -f 參數才能接指定的 jq 主程式 main.jq |
---|
接著把 main.jq 整理一下,將之前煩人的跳脫引號 \"
取代成普通的雙引號"
,如下:
# 期望參數 -c -r -s
# 期望輸入 direction.json typhoon1005.json beaufort_wind.json
def separate(f): f|split(",");
.[0] as $direction | .[1] as $ty | .[2] as $wind |
["時間 ","經度","緯度","氣壓","風速MAX ","陣風MAX ","方向 ","預測"],
[
$ty.records.tropicalCyclones.tropicalCyclone[] |
select(.typhoonName=="KRATHON") |
.analysisData.fix[-5:][] |
[
.fixTime[0:13],
separate(.coordinate)[0],
separate(.coordinate)[1],
.pressure,
((.maxWindSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level),
((.maxGustSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level),
$direction[.movingDirection],
.movingPrediction[0].value
]
][] |
@tsv
執行修改完的 krathon2024_json.bat 之後,可以看到如下結果,跟之前一樣。
今天我們認識了 jq 主程式可以獨立寫在 .jq 檔案裡面,真的有相見恨晚的感受阿。不僅可以按照段落換行,還可以用 #
加上註解,比起單行,更容易閱讀。接著使用 VSCode 開發,搭配語法高亮提示的擴充套件,就跟開發其他語言沒有兩樣了。今天的修改可以參考 原始碼 。
感謝自己,今天也有認真學習😄